package org.ponly.uno4j.support;

import org.ponly.common.proc.ProcTask;
import org.ponly.common.util.FileUtils;
import org.ponly.uno4j.core.DocToPdfTask;
import org.ponly.uno4j.core.UnoBridge;
import org.ponly.uno4j.core.UnoClient;
import org.ponly.uno4j.core.UnoTask;
import org.ponly.uno4j.util.P2s;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

import static org.ponly.common.proc.ProcStarter.Feedback;

/**
 * 文档转换为 SWF 样例, 此程序仅作为样例使用, 请勿作为生产使用
 *
 * @author vacoor
 */
public abstract class D2sSupport {
    public static final String PDF = "pdf";
    public static final String PDF_SUFFIX = ".pdf";
    private static final P2s PDF_TO_SWF = P2s.create().setFlashVersion(9).setVerbose(true);

    protected Future<?> submit(File source, File swf) throws FileNotFoundException {
        String fname = source.getName();
        String extension = FileUtils.getExtension(fname, false);
        FutureTask<Feedback> task;

        // 如果不是 pdf 则添加 文档 -> pdf -> swf 任务
        if (!PDF.equalsIgnoreCase(extension)) {
            task = submitDocToSwfTask(source, swf);
        } else {
            // 如果是 pdf, 则这直接执行 pdf -> swf 转换任务
            task = makePdfToSwfTask(source.getAbsolutePath(), swf.getAbsolutePath());
            doExecutePdfToSwfTask(task);
        }
        return task;
    }

    protected FutureTask<Feedback> submitDocToSwfTask(final File doc, final File swf) throws FileNotFoundException {
        String path = doc.getAbsoluteFile().getParent().replace("\\", "/");
        String filename = FileUtils.getNameWithoutExtension(doc.getName());
        final File pdf = new File(path, doc.getName() + PDF_SUFFIX);

        final UnoTask unoTask = makeDocToPdfTask(doc.getAbsolutePath(), pdf.getAbsolutePath());
        final FutureTask<Feedback> swfTask = makePdfToSwfTask(pdf.getAbsolutePath(), swf.getAbsolutePath());

        // 提交一个 DOC - SWF 任务
        getUnoClient().submit(new UnoTask() {
            @Override
            public void process(UnoBridge bridge) throws Exception {
                unoTask.process(bridge);

                // 当文档转换为 PDF 后执行 PDF - SWF 转换
                doExecutePdfToSwfTask(swfTask);
            }
        });
        return swfTask;
    }

    protected abstract UnoClient getUnoClient();

    protected abstract void doExecutePdfToSwfTask(FutureTask<?> pdfToSwfTask);

    /**
     * 创建一个 doc - pdf 转换任务
     *
     * @param doc 文档
     * @param pdf PDF 文件
     * @return DOC - PDF 转换任务
     */
    protected UnoTask makeDocToPdfTask(String doc, String pdf) throws FileNotFoundException {
        return new DocToPdfTask(new File(doc), new FileOutputStream(pdf));
    }

    /**
     * 创建一个 pdf - swf 转换任务
     *
     * @param pdf   PDF 文件
     * @param swf   SWF 文件
     * @param pages 要转换的页码
     * @return PDF - SWF 转换任务
     */
    protected ProcTask makePdfToSwfTask(String pdf, String swf, int... pages) {
        return PDF_TO_SWF.newTask(pdf, swf, pages);
    }
}
